#ifndef _QUEUE_H_
#define _QUEUE_H_

#include "../../embeddable/Embeddable.h"

/*
	class : Queue<Data>
	desc : Creates a generic queue. Follows
	the stl format for the most part. If you 
	want a different implementation or to use
	a different library just change the back end
	
*/
template<typename Data>
class Queue
{
	private:
		//array containing the data. Start address at least
		Data* array;
		//tells the current size of the queue
		unsigned int size;
		//tells the max size
		unsigned int max_size;
		//tells the start or front
		unsigned int start;
		//tells the end of the queue
		unsigned int end;
		//determines if I want to be able to resize the queue.
		unsigned char NoResize;
		//tells if I'm going to allocate the queue
		//used by the destructor.
		unsigned char allocated;
	public:
		//default constructor
		Queue();
		//constructor sets size and sets noResize
		Queue(unsigned char r, unsigned int size);
		//construct sets array and size
		Queue(Data* array, unsigned int size);
		//pushs data to the back
		void push(Data data) /*volatile*/;
		//resizes the queue
		void resize() /*volatile*/;
		//tells if the queue is empty
		unsigned char empty() /*volatile*/;
		//tells if the queue is full
		unsigned char full() /*volatile*/;
		//pops data from the front of the queue
		Data pop() /*volatile*/;
		//destructor of the queue.
		~Queue();
		//copy constructor
		Queue(const Queue& q);
		//assignment operator.
		Queue& operator=(const Queue& q) /*volatile*/;
};

#include "Queue.cpp"
#endif
